package slidingWindowAlgorithm.review4_20;

import java.util.HashMap;
import java.util.Map;

public class Class3 {
        public int lengthOfLongestSubstring(String s) {

            Map<Character, Integer> window = new HashMap<>();
            int left = 0, right = 0;
            int size = s.length();
            int res = 0;
            //  CKG TODO 2023/4/20:  1,不断向window里面添加元素  2,当有元素的个数大于1的时候也就是存在重复元素 这时候开始移动左指针 直到重复window里面重复元素的个数不大于1的时候 window里面就是不重复的元素
            //  CKG TODO 2023/4/20:  这时候比较res 和right-left的大小 取最大值 也就是不含重复元素的子字符串的最大长度


            while(right < size) {
                char c = s.charAt(right);
                window.put(c, window.getOrDefault(c, 0) + 1);
                right++;
                while(window.get(c) > 1) {
                    /* 一旦出现了重复字符，就需要收缩窗口了 */
                    char d = s.charAt(left);
                    left++;
                    window.put(d, window.get(d) - 1);
                }
                // [left, right) 窗口中没有重复字符
                res = Math.max(res, right - left);
            }


            return res;
        }

    public static void main(String[] args) {
        Class3 class3 = new Class3();
        System.out.println(class3.lengthOfLongestSubstring("abcabcbb"));

    }




}
